package com.jt.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.jt.anno.UseRedis;
import com.jt.mapper.ItemCatMapper;
import com.jt.pojo.ItemCat;
import com.jt.service.ItemCatService;
import com.jt.util.ObjectMapperUtil;
import com.jt.vo.EasyUITree;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;

import java.util.ArrayList;
import java.util.List;

/**
 * @author 张琪
 * @date 2020/11/27
 * @describe
 */
@Service
public class ItemCatServiceImpl implements ItemCatService {
    @Autowired
    private ItemCatMapper itemCatMapper;

    @Autowired(required = false)        //可以暂时不注入, 需要时再注入, 类似于懒加载
    private Jedis jedis;

    @Override
    public String doQueryItemName(Integer itemCatId) {
        return itemCatMapper.selectById(itemCatId).getName();
    }

    @Override
    @UseRedis(key = "ITEM_CAT_PARENT::", second = 7 * 24 * 60 * 60)
    public List<EasyUITree> doList(Long pid) {
        List<EasyUITree> treeList = new ArrayList<>();

//        EasyUI 中的 tree结构, 当树节点的state为closed时, 点击该树节点, 会向服务器发送url请求,
//        节点 1 和节点 2 是关闭的，当展开节点 1 时，将直接展示它的子节点。
//        当展开节点 2 时，将向服务器发送 value(2) 以便检索子节点。
        QueryWrapper<ItemCat> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("parent_id", pid);
        List<ItemCat> list = itemCatMapper.selectList(queryWrapper);
        String state = "open";
        for (ItemCat ic : list) {
            if (ic.getIsParent()) {
//                判断节点是否为父节点, 来更改节点状态
                state = "closed";
            }
            treeList.add(new EasyUITree(ic.getId(), ic.getName(), state));
        }

        return treeList;
    }

    /**
     * 实现步骤, (::后跟的为集合, 为固定写法)
     * 1. 先定义key , ITEM_CAT_PARENT::0
     * 2. 先查询缓存,
     * true: 获取缓存数据之后, 将json转化为对象, 之后返回
     * false: 应该查询数据库, 之后将数据保存到redis中, 默认生命周期为30天
     *
     * @param parentId 父节点id
     * @return 返回
     */

    @Override
    public List<EasyUITree> findItemCatCache(long parentId) {
        long t1 = System.currentTimeMillis();
//        1. 定义key
        String key = "ITEM_CAT_PARENT::" + parentId;
        List<EasyUITree> treeList = new ArrayList<>();
        String json;
        if (jedis.exists(key)) {
//            存在时,从缓存中获取数据, 将其转化为对象, 并返回
            json = jedis.get(key);
            treeList = ObjectMapperUtil.toObject(json, treeList.getClass());
        } else {
//            不存在时, 查询后, 将数据存储到缓存中
            treeList = doList(parentId);
            json = ObjectMapperUtil.toJson(treeList);
            jedis.setex(key, 7 * 24 * 60 * 60, json);
        }
        long t2 = System.currentTimeMillis();
        System.err.println("耗时为: " + (t2 - t1));
        return treeList;
    }
}
